package cn.demoncat.util.redis.entity;

/**
 * Redis Cache 常量
 *
 * 场景：Spring Cache 注解管理的缓存
 *
 * 1、服务中创建 RedisCache，添加到RedisConfig.CACHES
 * 2、方法添加注解：@Cacheable 方法执行后将返回值添加到缓存，下次查询时直接查缓存；@CacheEvict 方法执行后删除缓存
 *
 * @author 延晓磊
 * @since 2021年02月10日
 */
public class RedisCache {

    // 缓存名：分类
    private String name;
    // 缓存键：SpEL表达式
    private String key;
    // 过期秒数，0表示永久
    private long ttl;
    // 空闲秒数，0表示永久
    private long maxIdleTime;


    /**
     * 缓存键 - SpEL表达式
     */
    public interface Keys{
        /**
         * 类
         *
         * 简化：#root.targetClass == targetClass
         */
        String CLASS = "#root.targetClass";
        /**
         * 方法
         *
         * 简化：#root.methodName == methodName
         */
        String METHOD = "#root.methodName ";
        /**
         * 类.方法
         */
        String CLASS_METHOD = "targetClass + ':' + methodName";
        /**
         * 参数[0]
         *
         * 简化：#root.args[0] == #p0
         */
        String ARG = "#root.args[0]";
        /**
         * 类.方法.参数
         */
        String CLASS_METHOD_ARG = "targetClass + ':' + methodName + ':' + #p0";
        /**
         * 参数 id
         */
        String ARG_ID = "#id";
        /**
         * 类.方法.参数.属性
         */
        String CLASS_METHOD_ARG_ID = "targetClass + ':' + methodName + ':' + #id";
        /**
         * 参数.属性 data.id
         */
        String ARG_DATA_ID = "#data.id";
        /**
         * 类.方法.参数.属性
         */
        String CLASS_METHOD_ARG_DATA_ID = "targetClass + ':' + methodName + ':' + #data.id";
    }

    public RedisCache() {
        super();
    }

    /**
     * 是否为永不过期
     *
     * @return
     */
    public boolean isPersist(){
        return ttl <= 0;
    }

    /**
     * 创建缓存，永久
     *
     * @param name
     * @param key
     */
    public RedisCache(String name, String key) {
        this.name = name;
        this.key = key;
        this.ttl = 0;
        this.maxIdleTime = 0;
    }

    /**
     * 创建缓存
     *
     * @param name
     * @param key
     * @param ttl 过期时间
     */
    public RedisCache(String name, String key, long ttl) {
        this.name = name;
        this.key = key;
        this.setTtl(ttl);
        this.maxIdleTime = this.getTtl();
    }

    /**
     * 创建缓存
     *
     * @param name
     * @param key
     * @param ttl   过期时间
     * @param maxIdleTime   空闲时间
     */
    public RedisCache(String name, String key, long ttl, long maxIdleTime) {
        this.name = name;
        this.key = key;
        this.setTtl(ttl);
        this.setMaxIdleTime(maxIdleTime);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public long getTtl() {
        return ttl;
    }

    public RedisCache setTtl(long ttl) {
        if (ttl < 0) {
            ttl = 0;
        }
        this.ttl = ttl;
        return this;
    }

    public long getMaxIdleTime() {
        return maxIdleTime;
    }

    public RedisCache setMaxIdleTime(long maxIdleTime) {
        if (maxIdleTime < 0) {
            maxIdleTime = 0;
        }
        this.maxIdleTime = maxIdleTime;
        return this;
    }

}
